package br.com.syswill.boaviagem;



import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.ListActivity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.SimpleAdapter;
import android.widget.SimpleAdapter.ViewBinder;
import android.widget.TextView;
import android.widget.Toast;
import br.com.syswill.boaviagem.dao.GastoDAO;
import br.com.syswill.boaviagem.dao.ViagemDAO;
import br.com.syswill.boaviagem.domain.Gasto;
import br.com.syswill.boaviagem.domain.Viagem;
import br.com.syswill.boaviagem.util.Constantes;
import br.com.syswill.boaviagem.util.CategoriaGasto;

public class GastoListActivity extends ListActivity implements
		OnItemClickListener {

	private List<Map<String, Object>> gastos;
	private String dataAnterior = "";
	private GastoDAO gastoDAO;
	private ViagemDAO viagemDAO;
	private Long idViagem;
	private SimpleDateFormat dateFormat;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		gastoDAO = new GastoDAO(this);
		viagemDAO = new ViagemDAO(this);
		idViagem = getIntent().getLongExtra(Constantes.VIAGEM_SELECIONADA,-1);
		Viagem viagem = viagemDAO.buscarViagemPorId(idViagem);
		dateFormat = new SimpleDateFormat("dd/MM/yyyy");
		String[] de = { "data", "descricao", "valor", "categoria" };
		int[] para = { R.id.data, R.id.descricao, R.id.valor, R.id.categoria };
		SimpleAdapter adapter = new SimpleAdapter(this, listarGastos(viagem),
				R.layout.lista_gasto, de, para);

		adapter.setViewBinder(new GastoViewBinder());
		setListAdapter(adapter);
		getListView().setOnItemClickListener(this);

		registerForContextMenu(getListView());
	}

	@Override
	public void onItemClick(AdapterView<?> parent, View view, int position,
			long id) {
		Map<String, Object> map = gastos.get(position);
		String descricao = (String) map.get("descricao");
		String mensagem = "Gasto selecionada: " + descricao;
		Toast.makeText(this, mensagem, Toast.LENGTH_SHORT).show();
	}

	private List<Map<String, Object>> listarGastos(Viagem viagem) {
		gastos = new ArrayList<Map<String, Object>>();
		
		for (Gasto gasto:gastoDAO.listarGastos(viagem)) {
		Map<String, Object> item = new HashMap<String, Object>();
		String data = dateFormat.format(gasto.getData());
		item.put("data",data );
		item.put("descricao", gasto.getDescricao());
		item.put("valor", gasto.getValor());
		item.put("categoria", gasto.getCategoria());
		
		gastos.add(item);
		
		}
		return gastos;
	}

	private class GastoViewBinder implements ViewBinder {
		@Override
		public boolean setViewValue(View view, Object data,
				String textRepresentation) {

			if (view.getId() == R.id.data) {
				if (!dataAnterior.equals(data)) {
					TextView textView = (TextView) view;
					textView.setText(textRepresentation);
					dataAnterior = textRepresentation;
					view.setVisibility(View.VISIBLE);
				} else {
					view.setVisibility(View.GONE);
				}
				return true;
			}
			if (view.getId() == R.id.categoria) {
				
				view.setBackgroundColor(CategoriaGasto.valueOf(data.toString()).valorCategoria);
				return true;
			}
			return false;
		}
	}

	@Override
	public void onCreateContextMenu(ContextMenu menu, View v,
			ContextMenuInfo menuInfo) {
		MenuInflater inflater = getMenuInflater();
		inflater.inflate(R.menu.gasto_menu, menu);
	}

	@Override
	public boolean onContextItemSelected(MenuItem item) {
		if (item.getItemId() == R.id.remover) {
			AdapterContextMenuInfo info = (AdapterContextMenuInfo) item
					.getMenuInfo();
			gastos.remove(info.position);
			getListView().invalidateViews();
			dataAnterior = "";
			// remover do banco de dados
			return true;
		}
		return super.onContextItemSelected(item);
	}

}
